package com.daohang361.imqq.Asycore;

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;

import com.daohang361.imqq.ServerContex.SessionContex;

import java.net.SocketAddress;
/**
 * mina 事务监听控制端,处理所有逻辑控制层
 */
public class MinaHandler extends IoHandlerAdapter {

	/**
	 * messageSent是响应给成功后触发的事件
	 */
    @Override
    public void messageSent(IoSession session, Object message) throws Exception {
//       if (message instanceof IoBuffer) {
//        IoBuffer buffer = (IoBuffer) message;
//        byte[] bb = buffer.array();
//       }
    }

    @Override
    public void exceptionCaught(IoSession session, Throwable cause)
        throws Exception {
       cause.printStackTrace();
       session.close(false);
    }

    /**
     * 接收到UDP后触发的事件
     */
    @Override
    public void   messageReceived(IoSession session, Object message)
                throws Exception {
    	QQUser sessionQQ =(QQUser) message;
    	/**
    	 * 发送第一个登陆包的时候首先重新定位服务器地址，服务器地址
    	 * 可能已经重新被转向了
    	 */
    	if(sessionQQ.getLogintimes()==0){
    		System.out.println("重新定向!");
    		 int qqNumber = sessionQQ.getQq();
    		 IoSession newSession=SessionContex.getConnector(qqNumber).redirect();
    		 newSession.write(sessionQQ);
        }else{
        	session.write(sessionQQ);
        }
    }
    
    /**
     * 连接关闭触发的事件
     */
    @Override
    public void sessionClosed(IoSession session) throws Exception {
       System.out.println("Session closed...");
    }

    /**
     * 建立连接触发的事件
     */
    @Override
    public void sessionCreated(IoSession session) throws Exception {
       System.out.println("Session created...");
       SocketAddress remoteAddress = session.getRemoteAddress();
       System.out.println(remoteAddress);
       session.getRemoteAddress();
       session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 1);//设置回话空闲为1秒，用于空闲的时候发送消息队列
    }

//会话空闲

    @Override
    public void sessionIdle(IoSession session, IdleStatus status)
        throws Exception {
//    	  if (status == IdleStatus.BOTH_IDLE)
//    	  {
//    		  IoBuffer buffer1 = IoBuffer.wrap("heartbeat".getBytes());//返回信息给Clinet端
//    		  buffer1.flip();
//    	   session.write(buffer1);
//           System.out.println("Session idle...");
//    	  }

    }

    /**
     *打开连接触发的事件，它与sessionCreated的区别在于，一个连接地址（A）第一次请求Server会建立一个Session默认超时时间为1分钟，
     *此时若未达到超时时间这个连接地址（A）再一次向Server发送请求即是sessionOpened（连接地址（A）
     *第一次向Server发送请求或者连接超时后向Server发送请求时会同时触发sessionCreated和sessionOpened两个事件）
     */
    @Override
    public void sessionOpened(IoSession session) throws Exception {
       System.out.println("Session Opened...");
       SocketAddress remoteAddress = session.getRemoteAddress();
       System.out.println(remoteAddress);
    }

	public void messageSent() {

	}
}
